﻿#define _CRT_SECURE_NO_WARNINGS 1

#include <iostream>
#include <string>
//#include <cstring>
using namespace std;

//int main() {
//    string s;
//    getline(cin, s);
//    size_t pos = s.rfind(' ');
//    if (pos < s.size())cout<< (s.size() - 1 - pos);
//    else cout<< s.size();
//}
//int main()
//{
//	string s1("helloworld");
//	//cout << s.find(s);
//	//cout << s.rfind("ll");
//	//cout << s.substr(2, 2);
//	//s = s + ' ' + "tang" + ' ' + "can.";//传值返回
//	//string s;
//	//getline(cin, s);//getline遇到'\n'才结束，cin遇到空格就结束
//	//cout << s << endl;
//	string s2("tang can");
//	cout << (s1 <= s2);
//	cout << s1.rfind(' ') << endl;
//	cout << string::npos;
//	return 0;
//}
//int main()
//{
//	string s("hello world ");
//	//s.push_back('t');
//	//s.append(s);
//	//s.append(s, 1, 3);
//	//s.append("tang");
//	/*cout << s.size() << endl;
//	s.append("tang", 5);
//	cout << s.size() << endl;*/
//	//s.append(4, 't');
//	//s.append(s.begin() + 1, s.begin() + 5);
//	//s.append({ 't','c','h' });
//
//	//s += s;
//	//s += "tang";
//	//s += 't';
//	//s += {'t', 'c'};
//	/*cout << typeid(s).name() << endl;
//	cout << typeid(s.c_str()).name() << endl;
//	cout << s.c_str() << endl;*/
//	return 0;
//}
//int main()
//{
//	string s("hello world");
//	for (int i = 0; i < s.size(); i++)
//		cout << s[i] << ' ';
//	cout << endl;
//	string::iterator it = s.begin();
//	while (it != s.end())
//	{
//		cout << *it << ' ';
//		++it;
//	}
//	cout << endl;
//	string::reverse_iterator rit = s.rbegin();
//	while (rit != s.rend())
//	{
//		cout << *rit << ' ';
//		++rit;
//	}
//	cout << endl;
//	return 0;
//}
//int main()
//{
//	string s("hello world");
//	cout << s.size() << endl;
//	cout << s.capacity() << endl;
//	cout << s.empty() << endl;
//
//	cout << s.size() << ' ' << s.capacity() << endl;
//	/*s.clear();
//	cout << s.size() << endl;*/
//	/*s.reserve(17);
//	cout << s.size() << ' ' << s.capacity() << endl;
//	s.reserve(5);
//	cout << s.size() << ' ' << s.capacity() << endl;*/
//
//	s.resize(4);
//	cout << s.size() << ' ' << s.capacity() << ' '<<s<<endl;
//	s.resize(18,'c');
//	cout << s.size() << ' ' << s.capacity() <<' '<<s<< endl;
//	return 0;
//}
//int main()//构造
//{
//	//string s();//err 不知道是函数的声明还是使用
//	string s;
//	string s1("hello world");
//	string s2(s1);
//	string s3(s1, 6, 3);
//	string s4("hello world", 7);
//	string s5(4, 't');
//	string s6(++s1.begin(), --s1.end());
//	string s7(s1.begin(), s1.begin() + 7);
//	string s8 = { 't','c' };//string (initializer_list<char> il);//用初始化列表来初始化string类
//	cout << s << ' ' << s1 << ' ' << endl;
//	cout << s2 << endl;
//	cout << s3 << endl;
//	cout << s4 << endl;
//	cout << s5 << endl;
//	cout << s6 << endl;
//	cout << s7 << endl;
//	cout << s8 << endl;
//	return 0;
//}
//int main()//范围for
//{
//	int a[] = { 1,2,3,4,5,6,7 };
//	//c++98遍历
//	for (int i = 0; i < sizeof(a) / sizeof(a[0]); i++)
//		cout << a[i] << ' ';
//	cout << endl;
//
//	//c++11遍历
//	for (auto& x : a)
//		cout << x << ' ';
//	cout << endl;
//
//	string str("hello world");
//	for (auto& e : str)
//		cout << e << ' ';
//	cout << endl;
//	return 0;
//}
//int func1()
//{
//	return 10;
//}
//// 不能做参数
////void func2(auto a)
////{}
//// 可以做返回值，但是建议谨慎使用
//auto func3()
//{
//	return 3;
//}
//int main()
//{
//	int a = 10;
//	auto b = a;
//	auto c = 'a';
//	auto d = func1();
//	/* 编译报错:rror C3531 : “e”: 类型包含“auto”的符号必须具有初始值设定项
//	auto e;*/
//	cout << typeid(b).name() << endl;
//	cout << typeid(c).name() << endl;
//	cout << typeid(d).name() << endl << endl;
//
//	int x = 10;
//	auto y = &x;//指针
//	auto* z = &x;//指针
//	auto& m = x;//引用
//	cout << typeid(x).name() << endl;//int
//	cout << typeid(y).name() << endl;//int*
//	cout << typeid(z).name() << endl;//int*
//	cout << typeid(m).name() << endl << endl;//int
//
//	auto aa = 1, bb = 2;
//	/* 编译报错：error C3538: 在声明符列表中，“auto”必须始终推导为同一类型
//	auto cc = 3, dd = 4.0;*/
//	/* 编译报错：error C3318: “auto []”: 数组不能具有其中包含“auto”的元素类型
//	auto array[] = { 4, 5, 6 };*/
//
//	return 0;
//}

//#include<iostream>
//#include <cstdlib>
//#include <vector>
//#include <unordered_set>
//#include <string>
//using namespace std;
//bool wordBreak(string s, vector<string>& wordDict) {
//    //准备工作
//    unordered_set<string> hash;
//    for (auto& st : wordDict)
//        hash.insert(st);
//    //1.创建dp表
//    int n = s.size();
//    vector<bool> dp(n+1);//false
//    //2.初始化
//    dp[0] = true;
//    s.insert(0, 1, ' ');
//    //3.填表
//    int j = 1;
//    for (int i = 1; i <=n; i++)
//    {
//        //dp[j-1]==true&&s(j~i)在字典中
//        string tmp = s.substr(j, i - j + 1);
//        if (dp[j - 1] && hash.count(tmp))
//        {
//            dp[i] = true;
//            j = i + 1;
//        }
//    }
//    //返回值
//    return dp[n];
//}
//int findNumberOfLIS(vector<int>& nums) {
//    //1.创建dp表
//    int n = nums.size();
//    vector<int> len(n, 1), count(n, 1);//+初始化
//    //2.填表
//    int maxlen = 1, maxi = 0;
//    for (int i = 1; i < n; i++)
//    {
//        for (int j = 0; j < i; j++)
//        {
//            if (nums[j] < nums[i])
//            {
//                if (len[i] == len[j] + 1)count[i] += count[j];
//                else if (len[i] < len[j] + 1)len[i] = len[j] + 1, count[i] = count[j];
//            }
//        }
//        if (maxlen < len[i])
//        {
//            maxlen = len[i];
//            maxi = i;
//        }
//    }
//    //返回值
//    return count[maxi];
//}
//int main()
//{
//    vector<int> nums = { 2,2,2,2,2 };
//    cout << findNumberOfLIS(nums);
//   /* string s = "aaaaaaa";
//    vector<string> wordDict = { "aaaa", "aaa" };
//    cout << wordBreak(s, wordDict);*/
//    return 0;
//}
//int main()
//{
//	//动态申请一个int类型的内存
//	int* p1 = new int;
//	//动态申请一个int类型的内存，并初始化为10
//	int* p2 = new int(10);
//	//动态申请10个int类型的内存
//	int* p3 = new int[10];
//	p3[9] = 1;
//
//	delete p1;
//	delete p2;
//	delete[] p3;
//	return 0;
//}
//template<class T>
//void Swap(T& x, T& y)
//{
//	T tmp = x;
//	x = y;
//	y = tmp;
//}
//int main()
//{
//	char a, b;
//	cin >> a >> b;
//	Swap(a, b);
//	cout << "a=" << a << " b=" << b;
//	return 0;
//}
//template<class T>
//T add(const T& x, const T& y)
//{
//	return x + y;
//}
//int main()
//{
//	int a = 10, b = 20;
//	double c = 5.5, d = 1.2;
//	cout << add(1, b) << endl;
//	cout << add(c, d) << endl;
//	
//	cout << add(a, (int)c) << endl;//用户自己强制转化
//	cout << add<int>(a, c);//显示实例化
//	return 0;
//}